import {
	cloneDeep
} from 'lodash-es';
import buildFullPath from '../core/buildFullPath';
import settle from '../core/settle';
import buildURL from '../helpers/buildURL';
import {
	isUndefined
} from '../utils';

/**
 * 返回可选值存在的配置
 * @param {Array} keys - 可选值数组
 * @param {Object} config2 - 配置
 * @return {{}} - 存在的配置项
 */
const mergeKeys = (keys, config2) => {
	const config = {};
	keys.forEach((prop) => {
		if (!isUndefined(config2[prop])) {
			config[prop] = config2[prop];
		}
	});
	return config;
};

export default (config) => {
	return new Promise((resolve, reject) => {
		const fullPath = buildURL(buildFullPath(config.baseURL, config.url || ''), config.params);
		const _config = {
			url: fullPath,
			header: config.header,
			success: (res) => {
				try {
					if (typeof res.data === 'string') {
						res.data = JSON.parse(res.data);
					}
				} catch (e) {
					reject(e);
				}
				const cloneConfig = cloneDeep(config);
				cloneConfig.fullPath = fullPath;
				const response = {
					...res,
					config: cloneConfig,
				};
				settle(resolve, reject, response);
			},
			fail: (err) => {
				const cloneConfig = cloneDeep(config);
				cloneConfig.fullPath = fullPath;
				const response = {
					...err,
					config: cloneConfig,
				};
				settle(resolve, reject, response);
			},
		};

		let requestTask;
		if (config.method === 'UPLOAD') {
			delete _config.header['content-type'];
			delete _config.header['Content-Type'];
			const otherConfig = {
				// #ifdef MP-ALIPAY
				fileType: config.fileType,
				// #endif
				filePath: config.filePath,
				name: config.name,
			};
			const optionalKeys = [
				// #ifdef APP-PLUS || H5
				'files',
				// #endif
				// #ifdef H5
				'file',
				// #endif
				// #ifdef H5 || APP-PLUS
				'timeout',
				// #endif
				'formData',
			];
			const uploadFileOption = {
				..._config,
				...otherConfig,
				...mergeKeys(optionalKeys, config),
			};
			requestTask = uni.uploadFile(uploadFileOption);
		} else if (config.method === 'DOWNLOAD') {
			// #ifdef H5 || APP-PLUS
			if (!isUndefined(config['timeout'])) {
				_config['timeout'] = config['timeout'];
			}
			// #endif
			const downloadFileOption = _config;
			requestTask = uni.downloadFile(downloadFileOption);
		} else {
			const optionalKeys = [
				'data',
				'method',
				// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
				'timeout',
				// #endif
				'dataType',
				// #ifndef MP-ALIPAY
				'responseType',
				// #endif
				// #ifdef APP-PLUS
				'sslVerify',
				// #endif
				// #ifdef H5
				'withCredentials',
				// #endif
				// #ifdef APP-PLUS
				'firstIpv4',
				// #endif
			];
			requestTask = uni.request({
				..._config,
				...mergeKeys(optionalKeys, config)
			});
		}

		if (config.getTask) {
			config.getTask(requestTask, config);
		}
	});
};